﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// 
#pragma once

#include "GcmpModelInterface.h"
#include "IObject.h"
#include "Vector3d.h"

namespace gcmp {

    class IDocument;
    /// \brief 对象的删除上下文的接口。
    class GCMP_MODEL_INTERFACE_EXPORT IElementDeletionContext : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementDeletionContext, gcmp::IObject);
    public:
        /// \brief 创建单个对象删除的上下文。
        /// \param pDocument 当前文档
        /// \param elementIdsToDelete 初始要删除的对象
        /// \param elementIdsToBeDeleted 最终将被删除的对象，包括要被关联删除的对象。
        /// \param elementIdsToBeNotified 删除时需要通知的对象。尽量不要提供此参数，性能差。
        /// \param toBeNotified2ToBeDeletedWeakParents 删除时需要通知的对象，告知这个对象哪些弱父亲即将被删除。和elementIdsToBeNotified二选一，优先采用此参数。
        /// \return 返回创建的删除上下文
        static OwnerPtr<IElementDeletionContext> CreateElementDeletionContext(
            IDocument* pDocument,
            const std::set<ElementId>& elementIdsToDelete,
            const std::set<ElementId>& elementIdsToBeDeleted,
            const std::set<ElementId>& elementIdsToBeNotified,
            const std::map<ElementId, std::set<ElementId>>& toBeNotified2ToBeDeletedWeakParents = {}
        );

        /// \brief 获取当前文档。
        /// \return 返回一个文档的接口指针。
        virtual IDocument* GetDocument() const = 0;

        /// \brief 获取初始要删除的对象。
        /// \return 返回初始要删除的对象集合。
        virtual const std::set<ElementId>& GetElementIdsToDelete() const = 0;

        /// \brief 获取最终将要被删除的对象，包括初始删除对象和关联删除对象。
        /// \return 返回最终将要被删除的对象集合。
        virtual const std::set<ElementId>& GetElementIdsToBeDeleted() const = 0;

        /// \brief 获取删除时要通知的对象。
        /// \return 返回要通知的对象集合。
        virtual const std::set<ElementId>& GetElementIdsToBeNotified() const = 0;

        /// \brief 获取删除时要删除的对象的即将被删除的弱父亲
        /// \param id 对象Id
        /// \return 即将被删除的弱父亲
        virtual const std::set<ElementId>& GetToBeDeletedWeakParents(const ElementId& id) const = 0;
    };

}// namespace gcmp


